#pragma once
#include "expr.h"

class TipoDato :
	public Expr
{
public:

	TipoDato(void)
	{
	}

	~TipoDato(void)
	{
	}
	
	void setis(int tokentype){
		TokenType tt;
		is_ = tt.returntokenstring(tokentype);

	}

	virtual string is(){
		return is_;
	}

	void setValor(string valor){
		this->valor = valor;
	}

	string getValor(){
		return this->valor;
	}

	virtual tipo_ts * validarSemantica(tabla_simbolos *tabla_de_tipo,tabla_simbolos *tabla_de_varaible){
		if(this->is_.compare("Literal_Entero")==0){
			return tabla_de_tipo->get("ENTERO")->getTipo();
		}else{
			if(this->is_.compare("Literal_Real")==0){
				return tabla_de_tipo->get("REAL")->getTipo();
			}else{
				if(this->is_.compare("FALSO")==0){
					return tabla_de_tipo->get("BOOLEANO")->getTipo();
				}else{
					if(this->is_.compare("VERDADERO")==0){
						return tabla_de_tipo->get("BOOLEANO")->getTipo();
					}else{
						if(this->is_.compare("Literal_Caracter")==0){
							return tabla_de_tipo->get("CARACTER")->getTipo();
						}else{
							if(this->is_.compare("Literal_Cadena")==0){
								int size = this->valor.size();
								string id="CADENA";
								stringstream out;
								out << size;
								id.append(out.str());
								item_ts* its = tabla_de_tipo->get(id);
								if(its==0){
									its = new item_ts(new cadena(size),id);
								}
								return its->getTipo();
							}else{
								stringstream out;
								out<<"Literal No exite"<<endl;
								throw exception(out.str().c_str());
							}
						}
					}
				}
			}
		}
	}

private:
	string is_;
	string valor;




};

